package com.jpsl.core.items;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * abstract
 *
 * @param <Child>
 * @param <E>
 * @author 懒王猫
 */
public abstract class AbstractItems<Child extends AbstractItems<Child, E>, E> implements Items<E> {

    @SuppressWarnings("unchecked")
    private final Child typedThis = (Child) this;

    private final List<E> list;

    protected AbstractItems(List<E> list) {
        this.list = list;
    }

    /**
     * 添加元素
     *
     * @param e 元素
     * @return
     */
    @Override
    public Child add(E e) {
        if (e != null) {
            list.add(e);
        }
        return typedThis;
    }

    /**
     * 动态条件元素
     *
     * @param test 条件
     * @param supplier 元素获取器
     * @return
     */
    @Override
    public Child add(Condition test, Supplier<E> supplier) {
        if (test.test()) {
            E e = Objects.requireNonNull(supplier).get();
            return add(e);
        }
        return typedThis;
    }

    /**
     * 用 if 动态添加元素
     *
     * @param condition if的条件
     * @return
     */
    @Override
    public If<E, Child> $if(Condition condition) {
        return new If<>(new Branches<>(), condition, typedThis);
    }

    /**
     * 获取所有元素
     */
    @Override
    public List<E> all() {
        return Collections.unmodifiableList(list);
    }

    /**
     * @return true if empty
     */
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

}
